CloudFormationでALBリスナールールを変更する時にはPriorityに注意
はじめに
CloudFormationでALBリスナールールの変更をした際にハマった現象のメモです。
現象
以下のような状況でCloudFormationテンプレート更新を行おうとしたところ下記のようなエラーが発生しました。
- CloudFormationで構築したALBの既存のリスナーにルール(priority 2)を追加する
- リスナーには既に1つルール(priority 1)が設定されている
テンプレートだと以下のような状態です(詳細省略)
ListenerRuleP1: Type: AWS::ElasticLoadBalancingV2::ListenerRule Properties: # Priority以外は省略 Priority: 1 ## ListenerRuleP2を追加 ListenerRuleP2: Type: AWS::ElasticLoadBalancingV2::ListenerRule Properties: # Priority以外は省略 Priority: 2
スタック更新時に以下のエラーが発生しました。新たに作るListenerRuleP2のPriorityが既存ルールと重複しているようです。
Priority '2' is currently in use (Service: AmazonElasticLoadBalancingV2; Status Code: 400; Error Code: PriorityInUse; Request ID: XXXXXXXX)
リファレンス でもPriorityの重複は許されていないことが確認できます。
ルールの優先順位。リスナーは同じ優先度の複数のルールを持つことはできません。優先度を更新してルールの順序を変更しようとした場合、既存のルールでこの優先度がすでに使用されている場合は、新しい優先度を指定しないでください。これにより、エラーが発生する可能性があります。 別のルールで優先度を再利用する必要がある場合は、まず優先度を削除してから、後続の更新でその優先度を指定する必要があります。
何が起きていたのか
実際にリスナールールを確認するとListenerRuleP1のPriorityが変更されていました。実はこの前に手動でルールの変更や追加をした時に既存のルールのPriorityが変更されていました。
aws elbv2 describe-rules --listener-arn arn:aws:elasticloadbalancing:ap-northeast-1:nnnnnnnnn:listener/app/XXXXXXX | jq '.Rules[] | {RuleArn, Priority}' { "RuleArn": "arn:aws:elasticloadbalancing:ap-northeast-1:XXXXXXXXXXX", "Priority": "2" } { "RuleArn": "arn:aws:elasticloadbalancing:ap-northeast-1:YYYYYYYYYYYY", "Priority": "default" }
対策: 既存リスナールールのPriorityを変更する
このままだとテンプレートによるリスナーの追加が行えないばかりかリソースとテンプレートの差異が生じた状態のままとなってしまいます。スタックの更新を完了し穏やかな週末を迎えるために既存リスナールールのPriorityを変更します。
Priorityの変更は以下のようにaws cli で行えます。既存ルールのARNとテンプレートに定義されているPriorityの値を指定します。
aws elbv2 set-rule-priorities --rule-priorities RuleArn=arn:aws:elasticloadbalancing:ap-northeast-1:XXXXXXXXXXX,Priority=1
再度リスナールールを確認した上でスタックを更新するとリスナーが作成できました。
まとめ
AWS CLIの elbv2 set-rule-priorities
コマンドでPriorityを変更することでリスナールールのPriority重複エラーを解消することができます。